package cn.lili.modules.page.entity.dto;

import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.SceneEnums;
import cn.lili.modules.page.entity.enums.PageTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
 * 楼层装修存储传输对象
 *
 * @author liushuai(liushuai711 @ gmail.com)
 * @version v4.0
 * @Description:
 * @since 2023/4/14 9:21
 */
@Data
public class PageDataSaveDTO {

    @ApiModelProperty(value = "ID，修改时必填")
    private String id;
    @ApiModelProperty(value = "页面命名")
    @NotBlank(message = "页面命名不能为空")
    private String name;

    @ApiModelProperty(value = "页面数据")
    private String pageData;

    /**
     * @see PageTypeEnum
     */
    @ApiModelProperty(value = "页面类型")
    private PageTypeEnum pageType;

    /**
     * @see ClientTypeEnum
     */
    @ApiModelProperty(value = "客户端类型")
    private ClientTypeEnum pageClientType;

    @ApiModelProperty(value = "启用与否")
    private Boolean enable = true;


    @ApiModelProperty(value = "主要页面：部分场景如首页，只能有一个启动，则只能有一个主要页面。这里设置为true，其他相关页面则会自动设置为false")
    private Boolean main = false;


    @ApiModelProperty(value = "使用者场景")
    private SceneEnums useScene;


    //参数自检
    public void checkParamsSelf() {

        if (pageType == null) {
            throw new ServiceException("页面类型不能为空");
        }
        if (pageClientType == null) {
            throw new ServiceException("客户端类型不能为空");
        }

        //用户场景 对楼层数据的处理
        switch (UserContext.getCurrentUser().getScene()) {
            case SUPPLIER -> {
                this.useScene = SceneEnums.STORE;
            }
            case STORE -> {
                this.useScene = SceneEnums.MEMBER;
            }
            case MANAGER -> {
                //管理员可以操作所有楼层，所以这里需区分，如果没有则设置默认会员，否则按照传入的参数进行处理
                if (useScene == null) {
                    useScene = SceneEnums.MEMBER;
                }
            }
            default -> {
                throw new ServiceException();
            }
        }
    }

}
